package com.shuw.com.beingfortextproject.activity;

import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.widget.TextView;

import com.shuw.com.beingfortextproject.R;
import com.shuw.com.beingfortextproject.base.BaseActivity;
import com.shuw.com.beingfortextproject.utils.MailUtils;

import java.util.Properties;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.event.TransportEvent;
import javax.mail.event.TransportListener;
import javax.mail.internet.MimeMessage;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

/**
 * @csdn https://blog.csdn.net/kerry0071/article/details/28604267
 */
public class SendMailActivity extends BaseActivity {

	@BindView(R.id.center_title)
	TextView centerTitle;
	@BindView(R.id.toolbar)
	Toolbar toolbar;
	@BindView(R.id.infoTv)
	TextView infoTv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_send_mail);

		ButterKnife.bind(this);
		initView();
	}

	private void initView() {

		centerTitle.setText("邮件发送测试");
		setToolbar(toolbar);
	}

	@OnClick(R.id.sendBtn)
	public void onClick() {

		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					showToast("发送邮件");
//					sendEmail();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}).start();

	}

	/**
	 *  （a）建立TCP连接

	    （b）客户端发送HELO命令以标识发件人自己的身份，然后客户端发送MAIL命令；

	 服务器端正希望以OK作为响应，表明准备接收

	    （c）客户端发送RCPT命令，以标识该电子邮件的计划接收人，可以有多个RCPT行；

	 服务器端则表示是否愿意为收件人接收邮件

	    （d）协商结束，发送邮件，用命令DATA发送

	    （e）以.表示结束输入内容一起发送出去

	    （f）结束此次发送，用QUIT命令退出
	 *
	 * @throws Exception
	 */

	/**
	 *  可以在自己服务器上架设邮件服务
	 *  可以根据垃圾邮件策略
	 * */
	private void sendEmail() throws Exception {
//		根据不同的邮箱配置不同的邮件服务器
		// 1. 创建参数配置, 用于连接邮件服务器的参数配置
		Properties props = new Properties();          // 参数配置
		props.setProperty("mail.transport.protocol", "smtp");  // 使用的协议（JavaMail规范要求）
		props.setProperty("mail.smtp.host", "smtp.163.com");   // 发件人的邮箱的 SMTP 服务器地址
//		props.setProperty("mail.smtp.host", "smtp.qq.com");   // 发件人的邮箱的 SMTP 服务器地址
		props.setProperty("mail.smtp.auth", "true");      // 需要请求认证
		//如果遇到ssl类错误，请打开一下代码

		/*final String smtpPort = "465";
		props.setProperty("mail.smtp.port", smtpPort);
		props.setProperty("mail.smtp.socketFactory.class", "javax.NET.ssl.SSLSocketFactory");
		props.setProperty("mail.smtp.socketFactory.fallback", "false");
		props.setProperty("mail.smtp.socketFactory.port", smtpPort);*/
		// 2. 根据配置创建会话对象, 用于和邮件服务器交互
		Session session = Session.getDefaultInstance(props);
		// 设置为debug模式, 可以查看详细的发送 log
		session.setDebug(true);
		// 3. 创建一封邮件
//		MimeMessage message = MailUtils.createMimeMessage(session, "发送邮件的邮箱", "接受邮件的邮箱");//我这里是以163邮箱为发信邮箱测试通过
		MimeMessage message = MailUtils.createMimeMessage(session, "typetheway@163.com" ,"saviortyro@gmail.com");//我这里是以163邮箱为发信邮箱测试通过
		// 4. 根据 Session 获取邮件传输对象
		Transport transport = session.getTransport();
//		transport.connect("发送邮件邮箱", "发送邮件邮箱登录密码");
//		transport.connect("typetheway@163.com", "密码");
		transport.addTransportListener(new TransportListener() {
			@Override
			public void messageDelivered(TransportEvent e) {
				System.out.println("TransportEvent===> messageDelivered--"+e.getMessage());
				runOnUiThread(new Runnable() {
					@Override
					public void run() {
						showToast("发送结束....");
						infoTv.setText("发送成功...");
					}
				});

			}

			@Override
			public void messageNotDelivered(TransportEvent e) {
				System.out.println("TransportEvent===> messageNotDelivered--"+e.getMessage());
			}

			@Override
			public void messagePartiallyDelivered(TransportEvent e) {
				System.out.println("TransportEvent===> messagePartiallyDelivered--"+e.getMessage());
			}
		});
		// 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
		transport.sendMessage(message, message.getAllRecipients());
		// 7. 关闭连接
		transport.close();
		hideLoading();
	}


}
